//package com.lsh.config;
//
//import com.lsh.entity.SpringScheduledCron;
//import com.lsh.respsitory.SpringScheduledCronRepository;
//import com.lsh.task.ScheduledOfTask;
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationContext;
//import org.springframework.context.annotation.Bean;
//import org.springframework.scheduling.annotation.SchedulingConfigurer;
//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
//import org.springframework.scheduling.support.CronTrigger;
//import org.springframework.util.Assert;
//
//import java.util.concurrent.Executor;
//import java.util.concurrent.Executors;
//
///**
// * @author ：LiuShihao
// * @date ：Created in 2020/8/24 4:36 下午
// * @desc ：引入缓存以避免频繁查询数据库，提高性能
// *
// */
////@Configuration
//public class ScheduledConfig implements SchedulingConfigurer {
//    @Autowired
//    private ApplicationContext context;
//    @Autowired
//    private SpringScheduledCronRepository cronRepository;
//    @Override
//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//        // 通过jpa查询数据库的所有数据   for循环
//        for (SpringScheduledCron springScheduledCron : cronRepository.findAll()) {
//            //定义clazz
//            Class<?> clazz;
//            //定义一个Object类 task
//            Object task;
//            try {
//                clazz = Class.forName(springScheduledCron.getCronKey());
//                task = context.getBean(clazz);
//            } catch (ClassNotFoundException e) {
//                throw new IllegalArgumentException("spring_scheduled_cron表数据" + springScheduledCron.getCronKey() + "有误", e);
//            } catch (BeansException e) {
//                throw new IllegalArgumentException(springScheduledCron.getCronKey() + "未纳入到spring管理", e);
//            }
//            //TODO Assert断言
//            //isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)
//            // subType 后者 必须可以按类型匹配于 superType 前者 ，否则将抛出异常；
//            Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定时任务类必须实现ScheduledOfTask接口");
//            //TODO addTriggerTask(Runnable task, Trigger trigger)
//            //可以通过改变数据库数据进而实现动态改变执行周期
//            /**
//             *
//             * public void addTriggerTask(Runnable task, Trigger trigger) {
//             *      this.addTriggerTask(new TriggerTask(task, trigger));
//             *     }
//             * 使用这个方法会增加一个触发任务 ：即  ！这个定时任务的下一次执行时间！
//             * 参数：Runnable    一个事件
//             * 参数：Trigger     一个触发器
//             * public interface Trigger {
//             *     @Nullable
//             *     Date nextExecutionTime(TriggerContext var1);   下一次执行时间
//             * }
//             */
//            taskRegistrar.addTriggerTask(((Runnable) task),
//                    triggerContext -> {
//                        //获得该类的cron表达式
//                        String cronExpression = cronRepository.findByCronKey(springScheduledCron.getCronKey()).getCronExpression();
//                        // CronTrigger实现了Trigger
//                        return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);
//                    }
//            );
//        }
//    }
//    @Bean
//    public Executor taskExecutor() {
//        return Executors.newScheduledThreadPool(10);
//    }
//}